//! 一个主进程下HTTP代理服务器+多个worker进程多个HTTP应用服务器
//! 主进程创建多个子进程，同时接收子进程传来的信息，循环输出处理请求的数量
//! 子进程创建http服务器，监听8000端口并返回响应

const cluster = require('cluster');
const http = require('http');

//! 判断进程是否为主进程  如果为主进程，则返回true
if (cluster.isMaster) {

    let numReqs = 0;
    setInterval(() => {
        console.log(`numReqs = ${numReqs}`);
    }, 1000);

    function messageHandler(msg) {
        //! 接收下面子进程传过来的参数 
        if (msg.cmd && msg.cmd === 'notifyRequest') {
            numReqs += 1;
        }
    }
    //! os.cpus()获取有关于计算机的每个逻辑cpu内核的信息，方法返回一个对象
    const numCPUs = require('os').cpus().length;
    console.log(numCPUs);
    //! 启动多个进程 
    for (let i = 0; i < numCPUs; i++) {
        //! 创建worker进程
        cluster.fork();
    }
    //! 获取集群中所有存活的worker对象
    for (const id in cluster.workers) {
        //! 监听子进程的message事件 
        cluster.workers[id].on('message', messageHandler);
    }

} else {
    //! 子进程
    // Worker processes have a http server.
    http.Server((req, res) => {
        res.writeHead(200);
        res.end('hello world\n');

        //! 通知主进程关于请求 
        process.send({ cmd: 'notifyRequest' });
    }).listen(8000);
}
